package com.roubsite.sso.utils;

/**
 * 十六进制字符串 与 二进制byte数组互转 与 HexStringToBinary 类功能一样 实现方法稍有不同
 * 
 * @version 2016-3-5
 * @author leiduo
 */
public class Hex {
	/**
	 * 
	 * @param hexString
	 * @return 将十六进制字符转换为字节数组
	 */
	public static byte[] hexStringToBytes(String hexString) {
		if (hexString.length() % 2 != 0) {
			return null;
		}
		// hexString的长度对2取整，作为bytes的长度
		int length = hexString.length() / 2;
		char[] hexChars = hexString.toCharArray();
		byte[] bytes = new byte[length];
		for (int i = 0, j = 0; j < length; i++, j++) {
			String step = "" + hexChars[i++] + hexChars[i];// 每次取2个十六进制字符“FF”
			int k = Integer.parseInt(step, 16);// 使用指定基数的字符串参数表示的整数FF 表示255
			bytes[j] = new Integer(k).byteValue(); // 该方法的作用是以byte类型返回该 Integer 的值。只取低八位的值，高位不要。
		}
		return bytes;
	}

	/**
	 * 
	 * @param bytes
	 * @return 将二进制字节数组转换为十六进制字符输出
	 */
	public static String bytesToHexString(byte[] bytes) {
		String hexString = "";
		for (int i = 0; i < bytes.length; i++) {
			String step = Integer.toHexString(bytes[i] & 0xFF); // 将byte转16进制字符，必须与0xFF做与运算 按位同为1时则为1否则为0
																// 目的将byte转int时补的24个bit清0
			if (step.length() == 1) {
				step = "0" + step;
			}
			hexString += step;
		}
		return hexString.toUpperCase();
	}
}
